﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using ServicioRFIDMovil.Entidad;
using ServicioRFIDMovil.DataAccess;
using ServicioRFIDMovil.Herramientas;
using System.Data;

namespace ServicioRFIDMovil.Datos
{
    public class BienDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(BienDA));

        private const string FORMATO_BUSQUEDA = "{0}='{1}'";

        // Parametros Entrada
        private const string PARAM_VCODBARRA = "P_VCODBARRA";
        private const string PARAM_CURSOR_BIENES = "P_LISTABIEN";
        private const string PARAM_CURSOR_ETIQUETAS = "P_LISTAETIQUETAS";

        private const string PARAM_BIENPRESTAMO = "P_BIENPRESTAMO";
        private const string PARAM_USUARIOMODI = "P_USUARIOMODI";

        // Parametros Salida
        private const string IIDBIEN = "IIDBIEN";
        private const string VCODBARRA = "VCODBARRA";
        private const string VDESCRIPCION = "VDESCRIPCION";
        private const string BHABILITADO = "BHABILITADO";
        private const string IIDBIENESTADO = "IIDBIENESTADO";
        private const string IIDESTADOPRESTAMO = "IIDESTADOPRESTAMO";
        private const string IIDBIENSITUACION = "IIDBIENSITUACION";

        private const string VCODEPC = "VCODEPC";

        #endregion

        #region --- Metodos Propios ---

        public ListaBien buscarBienEtiqueta(Etiqueta etiqueta)
        {
            ListaBien listaBien = null;
            DataSet dsData = new DataSet();
            string filtro = string.Empty;

            Bien bien = null;
            ListaEtiqueta listaEtiqueta = null;

            if (log.IsDebugEnabled)
            {
                log.Debug("buscarBienEtiqueta(" + etiqueta.bien.codBarra + ")");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = Constantes.PROCEDIMIENTO_RFID_BUSCARBIENETIQUETA;
                db.agregarParametro(PARAM_VCODBARRA, DbType.String, ParameterDirection.Input, etiqueta.bien.codBarra);
                db.agregarParametro(PARAM_CURSOR_BIENES, DbType.Binary, ParameterDirection.Output, null);
                db.agregarParametro(PARAM_CURSOR_ETIQUETAS, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsData);

                // Instanciando listado de expedientes
                listaBien = new ListaBien();

                foreach (DataRow filaBien in dsData.Tables[0].Rows)
                {
                    bien = new Bien();
                    listaEtiqueta = new ListaEtiqueta();

                    // Estableciendo datos del bien
                    bien = generarEntidadBien(filaBien);

                    // Estableciendo filtro de busqueda de etiquetas por bien
                    filtro = string.Format(FORMATO_BUSQUEDA, IIDBIEN, bien.idBien.ToString());

                    // Cargando lista de etiquetas asociado al expediente actual
                    foreach (DataRow filaEtiqueta in dsData.Tables[1].Select(filtro))
                    {
                        listaEtiqueta.Add(generarEntidadEtiqueta(filaEtiqueta));
                    }

                    // Estableciendo el listado de etiquetas asociados
                    bien.listaEtiqueta = listaEtiqueta;

                    // Agregando bien al listado
                    listaBien.Add(bien);
                }
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("Retornando " + listaBien.Count + " registros");
            }

            return listaBien;
        }

         private Bien generarEntidadBien(DataRow fila)
        {
            Bien bien = new Bien();
            bien.idBien = Convert.ToInt32(fila[IIDBIEN]);
            bien.codBarra = fila[VCODBARRA].ToString();
            bien.descripcion = fila[VDESCRIPCION].ToString();
            bien.habilitado = Convert.ToInt32(fila[BHABILITADO]);
            bien.codBienEstado = Convert.ToInt32(fila[IIDBIENESTADO]);
            bien.codBienPrestamo = Convert.ToInt32(fila[IIDESTADOPRESTAMO]);
            bien.codBienSituacion = Convert.ToInt32(fila[IIDBIENSITUACION]);

            return bien;
        }
              

        private Etiqueta generarEntidadEtiqueta(DataRow fila)
        {
            Etiqueta etiqueta = new Etiqueta();

            etiqueta.bien = new Bien();
            etiqueta.bien.idBien = Convert.ToInt32(fila[IIDBIEN]);
            etiqueta.epc = fila[VCODEPC].ToString();
            etiqueta.habilitado = Convert.ToInt32(fila[BHABILITADO]);

            return etiqueta;
        }      

        private Etiqueta generarEntidadEtiquetaCompleto(DataRow fila)
        {
            Etiqueta etiqueta = new Etiqueta();

            etiqueta.bien = new Bien();
            etiqueta.bien.idBien = Convert.ToInt32(fila[IIDBIEN]);
            etiqueta.epc = fila[VCODEPC].ToString();
            etiqueta.habilitado = Convert.ToInt32(fila[BHABILITADO]);

            return etiqueta;
        }

        //Se modifica bien:
        //Genera una inicidencia se edita los campos de estado y usuario edita
        public bool actualizarBien(Bien bien)
        {
            bool resultado = false;

            if (log.IsDebugEnabled)
            {
                log.Debug("actualizarBien()");
            }

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexTvperu))
            {
                db.NombreProcedimiento = DataBaseHelper.obtenerNombreProcedimiento(Constantes.PROCEDIMIENTO_RFID_ACTUALIZARBIEN);
                db.agregarParametro(PARAM_VCODBARRA, DbType.Int32, ParameterDirection.Input, bien.codBarra);
                db.agregarParametro(PARAM_BIENPRESTAMO, DbType.Int32, ParameterDirection.Input, bien.codBienPrestamo);
                db.agregarParametro(PARAM_USUARIOMODI, DbType.Int32, ParameterDirection.Input, bien.usuarioEdita.idUsuario);

                db.ejecutar();

                resultado = true;
            }

            return resultado;
        }

       
        #endregion

    }
}
